/*
   I/O操作
   1 三个不同的stream，只是源头不同，分别为控制台（键盘和显示器）、文件以及内存(字符串).
   2 格式控制，操作语法等完全相同。 
   
*/
#include <iostream>
#include <fstream>
#include <sstream>
#include <iomanip>  
#include <string>

using namespace std;
int main()
{
    /*  输入输出 
           cin cout
        header file:
            #include <iostream>   
            #include <iomanip>
    */  
    cout<<string(20,'*')<<endl;
    int a =0;
    float b = 0.0;
    cin>>a>>b;
    cout<<setw(5)<<left<<a<<endl;  //right:右对齐
    cout<<hex<<a<<endl;  //dec:十进制，默认  oct:八进制
    cout<<fixed<<setprecision(2)<<b<<endl;
    
    /* 数据类型转换
            stringstream
       how:
           #include <sstream>
           #include <iomanip> 
    */

    cout<<string(20,'*')<<endl;
    float c = 123.4567;
    stringstream ss;
    string ts;
    ss<<fixed<<setprecision(2)<<c;
    ss>>ts;
    cout<<ts<<endl;

    ts = "123.4567";
    ss<<ts;
    ss>>c;
    cout<<c;

    /* 读写文件
            fstream
       header files:
           #include <fstream>
           #include <iomanip> 
    */

    cout<<string(20,'*')<<endl;
    ofstream fout("file.txt");
    fout<<"this is a test!\n"<<fixed<<setprecision(2)<<c;
    fout.close();
   
    ifstream fin("file.txt");
    string line;
    float cc;
    getline(fin,line);
    fin>>cc;
    fin.close();
    cout<<line<<" "<<cc;

    /*
    格式控制
    1 包含头文件 <iomanip>
    2 manipulator,称为操控器，其实就是函数。
    3 这些函数的名字，就是对格式控制的描述。
    */
    cout<<endl<<string(20,'*')<<endl;
    //打印乘法表
    for(int i = 1; i<10; i++)
    {
        for(int j  = 1; j<10; j++)
        {
            if(j<=i)
                cout<<setw(5)<<left<<dec<<i*j;
        }
        cout<<endl;
    }
}
